//类型别名
//别名:    type Arrtype = (number|string)[]


//直接写
let objT: {
    name: string;
    age: number;
    str?: string;//这个是可选值
};

//对象类型 --别名------复用
type Objtype = {
    name: string;
    age: number;
    say(): void
}
//下面使用类型别名
let obj: Objtype = {
    name: "124234",
    age: 2354345,
    say() {
        return 32423
    },
}
let obj2: Objtype = {
    name: "第二个",
    age: 12,
    say() {
        console.log("调用say函数");
        return 'sdfsdg'
    },
}
obj2.say()

//当一个对象类型被多次使用时，也可以使用接口（interface）来描述对象的类型，达到复用的目
/* 
使用interface关键字来声明接口
接口名称(比如，此处的 IPerson)，可以是任意合法的变量名称，推荐以I开头
声明接口后，直接使用接口名称作为变量的类型
因为每一行只有一个属性类型，因此，属性类型后没有 ;(分号)
*/

//对象类型 - 接口interface  -------复用 (常用)
interface IPerson {
    name: string;
    age: number;
    sex?: string;
    run(): string;
    eag(): void
}
let per: IPerson = {
    name: "接口形式",
    age: 12,
    run() {
        console.log("跑");
        return "跑"
    },
    eag() {
        console.log("吃");

    },
}
per.name
console.log("per.name==", per.name);
console.log();
per.age
per.run()
per.eag()



/* 

对象类型-interface vs type
目标：能够理解interface和type的相同点和不同点
内容：interface（接口）和 type（类型别名）的对比：
相同点：都可以给对象指定类型
不同点:
    (1)接口，只能为对象指定类型
    (2)类型别名，不仅可以为对象指定类型，实际上可以为任意类型指定别名
*/



//对象类型-接口继承 extends
//如果两个接口之间有相同的属性或方法，可以将公共的属性或方法抽离出来，通过继承来实现复用

interface num1{
    a:string,
    b:string
}

interface num2 extends num1{
    c:number,
    d?:number
}

let qqq:num1={
    a:"123",
    b:"456",
    // c:"123",//没有c这个字
}

let www:num2={
    a:"1111",
    b:"22222",
    c:3453346,
    d:345346
}

console.log("qqq-num1",qqq);
console.log("www-num2",www);












export { }